package com.example.demo.controller;

import com.example.demo.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-10-05
 * Time: 15:39
 */

@Slf4j
@Controller
@ResponseBody //加在类的上面 这个类中的所有方法 返回的是非静态页面的数据
public class DemoController {
    //获取前端传来Json格式的数据

    private UserInfo userInfo;

    //在参数中加@RequestBody注解 获取Json格式的参数
    //注意@ResponseBody 两个参数的区别
    @RequestMapping(value = "/getjson")
    public String Json(@RequestBody UserInfo userInfo){
        return "用户信息: " + userInfo;
    }

    //获取URL中的参数 不是queryString中的参数 时URL地址中的参数
    //此处的应用场景 会得到搜索引擎较高的优先级显示

    //此处的URL： http://localhost:8080/hero/1/%E5%AD%99%E7%AD%96（处理过的汉字）
    @RequestMapping("/hero/{id}/{name}")
    public String getHero(@PathVariable Integer id,@PathVariable String name){
        return "ID: " + id + " | Name: " + name;
    }

    //上传文件
    //简单实现一个案列 修改头像的功能
    @RequestMapping("/upimg")           //这是前端传来的图片的名字
    public boolean upImg(Integer uid, @RequestPart("img")MultipartFile file){
        boolean result = false;
        //保存图片到本地目录
        //这个方法 是将文件传到某一个地址
        try {
            file.transferTo(new File("D:\\7ZIP\\img.png"));
            result = true;
        } catch (IOException e) {
            log.error("上传图片失败: " + e.getMessage());
        }
        return result;
    }
    //这是基础的文件上传 因为路径 名字等信息都是写死的那么 下一次上传会覆盖上次的容易 s

    @RequestMapping("/upimgs")           //这是前端传来的图片的名字
    public boolean upImg2(Integer uid, @RequestPart("img")MultipartFile file){
        boolean result = false;
        //基础以上 做出修改
        //1.图片保存在那个目录里(问题就是 运行环境 和 开发环境的不同 那么这借助配置配置文件来处理更加灵活)
        //2.图片的名称 （名字不能重复） (时间戳+随机数 也会存在重复的可能 即使概率小) {UUID 最可靠}
        //3.获取原图片上传的格式
        //获取图片的文件名
        String filename = file.getOriginalFilename();
        //对文件名做一个截取  得到文件后缀
        filename = filename.substring(filename.lastIndexOf("."));
        filename = UUID.randomUUID().toString() + filename;
        //UUID 生成一个全球唯一DIp

        try {
            file.transferTo(new File(imgPath + filename));
            result = true;
        } catch (IOException e) {
            log.error("上传图片失败: " + e.getMessage());
        }
        return result;
    }

    //从配置文件中 读取图片的保存路径
    @Value("${img.path}")
    private String imgPath;

    @RequestMapping("/say")
    public String say(){return imgPath;}


    //Servlet 获取 Cookie的方法
    @RequestMapping("/cookie")
    public void getCookie(HttpServletRequest request){
        //得到全部的Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie item : cookies){
            log.info("Cookie Name: " + item.getName() +
                    " Cookie Value: " + item.getValue());
        }
    }

    //使用@CookieValue
    @RequestMapping("/cookie2")
    public String getCookie2(@CookieValue(value = "bite",required = false) String cookie) {
        return "Cookie Value: " + cookie;
    }

    //获取header里面的信息
    @RequestMapping("/getua")
    public String getHead(HttpServletRequest request){
        return  "header: " + request.getHeader("User-Agent");
    }

    //方法二 获取请求头
    @RequestMapping("getua2")
    public String getHead2(@RequestHeader("User-Agent") String userHead){
        return "header: " + userHead;
    }

    //存储和获取Session
    @RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest request){
        boolean result = false;
        //1.得到HttpSession
        HttpSession session = request.getSession(true);
        //2.使用setAttribute
        session.setAttribute("userinfo","userinfo");
        result = true;
        return result;
    }

    //注解获取session方法
    @RequestMapping("/getsess")
    public String getSession(@SessionAttribute(value = "userinfo",required = false) String userinfo){
        return "会话" + userinfo;
    }

    @RequestMapping("/getsess1")
    public String getSession(HttpServletRequest request){
        String result = null;
        //1.得到HttpSession对象
        HttpSession session = request.getSession();
        //2.getAtt 得到session信息
        if (session != null && session.getAttribute("userinfo") != null){
            result = (String) session.getAttribute("userinfo");
        }
        return result;
    }

}
